#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>

#define FIFO_NAME "/tmp/my_fifo"

int main(int argc, char* argv[])
{
    int res;
    int open_mode = 0;
    int i;

    if (argc < 2)
    {
        fprintf(stderr, "Usage: %s <som combination of O_RDONLY O_WRONLY O_NOBLOCK>\n", *argv);
        exit(EXIT_FAILURE);
    }

    for (i = 1; i < argc; i++)
    {
        if (strncmp(*++argv, "O_RDONLY", 8) == 0)
        {
            open_mode |= O_RDONLY;
        }
        else if (strncmp(*argv, "O_WRONLY", 8) == 0)
        {
            open_mode |= O_WRONLY;
        }
        else if (strncmp(*argv, "O_NONBLOCK", 10) == 0)
        {
            open_mode |= O_NONBLOCK;
        }
    }

    if (-1 == access(FIFO_NAME, F_OK))
    {
        res = mkfifo(FIFO_NAME, 0777);
        if (0 != res)
        {
            fprintf(stderr, "Could not create file %s\n", FIFO_NAME);
            exit(EXIT_FAILURE);
        }
    }

    printf("Process %d opening FIFO\n", getpid());
    res = open(FIFO_NAME, open_mode);
    printf("Process %d result %d\n", getpid(), res);

    sleep(5);
    if (-1 != res)
    {
        close(res);
    }
    printf("Process %d finished\n", getpid());

    exit(EXIT_SUCCESS);
}
